import {createRouter, createWebHashHistory} from 'vue-router'
import routes from './routers'
import {getRefreshToken, getToken, setTitle, setToken} from '@/libs/util.js'
import config from '@/config'
import {LoadingBar} from "view-ui-plus";
import {useLoginStore} from "@/module-base/stores/login.js";
import {refreshTokenAndRetry} from '@module-base/api/login.js'


// console.log(routes)
const router = createRouter({
    history: createWebHashHistory(''),
    routes
})
console.log(import.meta.env.MODE)
const LOGIN_PAGE_NAME = 'login'
const {homeName} = config

const checkToken= async (token)=>{
    // 检查 Token 过期时间（JWT 示例）
    try {
        if(!token) return false
        // 1. 分割 Token 的三部分（Header、Payload、Signature）
        const [header, payload, signature] = token.split('.');
        if (!payload) throw new Error('Invalid JWT');

        // 2. 将 Base64Url 编码的 payload 转为 JSON
        const decodedPayload = JSON.parse(
            atob(payload.replace(/-/g, '+').replace(/_/g, '/'))
        );
        let isValid=true
        if (decodedPayload?.exp) {
            const isExpired = decodedPayload.exp < Date.now() / 1000;
            if (isExpired) {
            //     重新签发令牌
                const {data: data,success} = await refreshTokenAndRetry(getRefreshToken())
                if(success){
                    console.log('重新签发令牌成功')
                    setToken(data.accessToken, data.refreshTokenId)

                }else {
                    console.log('重新签发令牌失败')
                    isValid=false
                }

            }
            console.log('isExpired:' + isExpired)
        }
        return isValid;
    } catch (error) {
        console.error('JWT 解析失败:', error);
        return false;
    }
}
const switchRouter = async function (token, to, from) {
    try {
        const tokenFlag = await checkToken(token)
        // 不需要检验的页面
        if (to.meta.noToken) {
            return true
        }
        // 未登录
        if (!tokenFlag && to.name !== LOGIN_PAGE_NAME) {
            // 未登录且要跳转的页面不是登录页
            return {
                name: LOGIN_PAGE_NAME // 跳转到登录页
            }
        } else if (!tokenFlag && to.name === LOGIN_PAGE_NAME) {
            // 未登陆且要跳转的页面是登录页
            return true // 跳转
        }
        // 已登录
        if(tokenFlag){
            const {hasRouter,setRouters} = useLoginStore()
            if (!hasRouter) {
                await setRouters()
            }

            if (to.meta.noToken) {
                // 不需要token的情况,TODO:在最前面已经判断，这里考虑是不是可以删除
                const {routers} = useLoginStore()
                console.log(routers);
                return true
            } else if (to.name === LOGIN_PAGE_NAME) {
                // 已登录且要跳转的页面是登录页
                return {
                    name: homeName // 跳转到homeName页
                }
            } else{
                return true
            }
        }

    } catch (err) {
        // 必须设置token为空，否则会进入死循环
        setToken('')
        return {
            name: LOGIN_PAGE_NAME // 跳转到登录页
        }
    }

}



//路由结构换了
const loadView = (view) => {
    // 路由懒加载
        /*用vite import的方式修改*/
    const allComponents = import.meta.glob('@/**/*.vue')
    let component = allComponents['/src/' + view + '.vue']
    // let getComFn = import.meta.glob('@/**/*.vue')['/src/projects/project-base/modules/' + view + '.vue']
    if (!component) {
            console.error('loadView方法报错：找不到页面，请检查路由' + view)
            return import('@/module-error/view/404.vue')

        }
    return component

}
router.beforeEach(async (to, from) => {
    //用户变了,TODO:忘了为什么要在token这写内存中保存的token了

    const {token: storeToken} = useLoginStore()

    LoadingBar.start()
    // const token = getToken() || storeToken
    const token = getToken()
    return await switchRouter(token, to, from)
})

router.afterEach((to) => {
    LoadingBar.finish()
    setTitle(to)
    window.scrollTo(0, 0)
})

export default router
